package com.mlx.permission.column;


import com.mlx.permission.entity.ColumnPermission;
import com.mlx.permission.inter.Validator;

import java.util.Collection;
import java.util.Map;
import java.util.Set;

/**
 * 列权限验证器：
 *     确定列权限的容器为Map类型
 *
 * @param <P> 功能权限实体类型
 */
public interface IColumnValidator<P extends ColumnPermission> extends Validator<P, Map<String, Set<String>>> {

    /**
     * 判断当前实体是否拥有表名为【tableName】的列名为【permissionValue】的列权限
     *
     * @param permissionValue 权限值，权限值也是字段名称或列名称
     * @param tableName 表名称
     * @return 布尔值
     */
    boolean isHavePermission(String permissionValue, String tableName);

    default boolean isNotHavePermission(String permissionValue, String tableName){
        return !isHavePermission(permissionValue, tableName);
    }

    /**
     * 列过滤：用null覆盖不在实体列权限范围内的数据列
     *
     * @param dataCollection 数据集合
     * @param tableName 数据所属数据表的表名称
     *
     */
    void columnFilter(Collection<?> dataCollection, String tableName);

    /**
     * 列过滤：用null覆盖不在实体列权限范围内的数据列
     *     支持Map类型以及类似Map类型的类型
     * @param dataCollection 数据集合
     * @param tableName 数据所属数据表的表名称
     * @param getterName 获取属性值的方法名称，类似Map类型的get()方法
     * @param setterName 设置属性值的方法名称，类似Map类型的put()方法
     * @param fieldSetMethodName 获取所有属性的方法名称，类似Map类型的keySet()方法
     */
    void columnFilter(Collection<?> dataCollection, String tableName, String getterName, String setterName, String fieldSetMethodName);
}
